/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Procedures;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Marco
 */
public class DBConection {

    private Connection conexion;
    private ResultSet resultado;
    private Statement sentencia;

    //Datos de la BD
    private String host;
    private String bd;
    private String bdUsuario;
    private String bdClave;

    public DBConection(String host, String bd, String user, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            setHost(host);
            setBd(bd);
            setBdUsuario(user);
            setBdClave(password);
            conectarBD();
        } catch (Exception e) {
            System.out.println("No se pudo cargar el puente JDBC-ODBC." + e.getMessage());
            return;
        }
    }

    public void conectarBD(){
        try {
            setConexion(DriverManager.getConnection("jdbc:mysql://" + host + ":3306/" + bd, bdUsuario, bdClave));
            setSentencia(conexion.createStatement());
            System.out.println("Conectado desde BDConexion");
        } catch (Exception e) {
            System.out.println("Error desde BDConexion()" + e.getMessage());
        }
    }

    public void conectarBD(String bd, String bdUsuario, String bdPass){
        try {
            if (!getConexion().isClosed()){
                getConexion().close();
            }
            setConexion(DriverManager.getConnection( bd, bdUsuario, bdPass));
            setSentencia(conexion.createStatement());
            System.out.println("Conectado a la base de datos");
        } catch (Exception e) {
            System.out.println("Error" + e.getMessage());
        }
    }

    public boolean estadoDeLaConexion(){
        if (getConexion() != null){
            try {
                //if (getConexion().isValid(1000)) {
                if (!getConexion().isClosed()) {
                    return true;
                }
            } catch (SQLException ex) {
                Logger.getLogger(DBConection.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        else System.out.println("La conexion aún no se ha inicializado");
        return false;
    }

    public void terminarConexion() {
        if (getConexion() != null)
		try {
	            if (!getConexion().isClosed()) getConexion().close();
	            System.out.println("Conexion terminada");
	        } catch (SQLException ex) {
	            Logger.getLogger(DBConection.class.getName()).log(Level.SEVERE, null, ex);
	        }
    }

    public ResultSet sendSQLQuery(String sql) {
        try {
            setResultado(getSentencia().executeQuery(sql));
            System.out.println("Secuencia enviada exitosamente sendSQLQuery\n" + sql);
        } catch (Exception e) {
            System.out.println(e);
            System.out.println("Error sendSQLQuery " + e.getMessage());
        }
        return getResultado();
    }

    public void sendSQL(String sql) {
        try {
            getSentencia().execute(sql);
            System.out.println("Secuencia enviada exitosamente sendSQL\n" + sql);
        } catch (SQLException ex) {
            Logger.getLogger(DBConection.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error sendSQL " + ex.getMessage());
        }
    }

    public String[] getLastResultSetColumnStrings(int columna){
        String[] strings = null;
        String[] temp = null;
        System.out.println("Iniciando busqueda por index de columna");
        if (getResultado() != null) {
            try {
                getResultado().beforeFirst();
                while (getResultado().next()) {
                    if (strings != null) {
                        temp = new String[strings.length + 1];
                    } else {
                        temp = new String[1];
                    }
                    for (int i = 0; i < temp.length-1; i++) {
                        temp[i] = strings[i];
                    }
                    temp[temp.length - 1] = getResultado().getObject(columna).toString();
                    strings = temp;
                }
            } catch (SQLException ex) {
                Logger.getLogger(DBConection.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Error al obtener Strings de columna. "
                        + "Existe la columna en la consulta??");
                return null;
            }
        }
        return strings;
    }
    public String[] getLastResultSetColumnStrings(String etiquetaColumna){
        String[] strings = null;
        String[] temp = null;
        if (getResultado() != null) {
            System.out.println("Iniciando busqueda por etiqueta de columna");
            try {
                getResultado().beforeFirst();
                while (getResultado().next()) {
                    if (strings != null) {
                        temp = new String[strings.length + 1];
                    } else {
                        temp = new String[1];
                    }
                    for (int i = 0; i < temp.length-1; i++) {
                        temp[i] = strings[i];
                    }
                    temp[temp.length - 1] = getResultado().getObject(etiquetaColumna).toString();
                    strings = temp;
                }
            } catch (SQLException ex) {
                Logger.getLogger(DBConection.class.getName()).log(Level.SEVERE, null, ex);
                System.out.println("Error al obtener Strings de columna. "
                        + "Existe la columna en la consulta??");
                return null;
            }
        }
        return strings;
    }

    public String getBd() {
        return bd;
    }

    public String getBdClave() {
        return bdClave;
    }

    public String getBdUsuario() {
        return bdUsuario;
    }

    public Connection getConexion() {
        return conexion;
    }

    public String getHost() {
        return host;
    }

    public ResultSet getResultado() {
        return resultado;
    }

    private Statement getSentencia() {
        return sentencia;
    }

    public void setBd(String bd) {
        this.bd = bd;
    }

    public void setBdClave(String bdPass) {
        this.bdClave = bdPass;
    }

    public void setBdUsuario(String bdUser) {
        this.bdUsuario = bdUser;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public void setHost(String host) {
        this.host = host;
    }

    private void setResultado(ResultSet resultado) {
        this.resultado = resultado;
    }

    private void setSentencia(Statement sentencia) {
        this.sentencia = sentencia;
    }

}

